# flags
# do *not* add CXXFLAGS here, add them in configure.ac
AM_CXXFLAGS = $(CXXFLAGSDEFAULT)
if DEBUG
AM_CXXFLAGS += -DRE2C_DEBUG
endif
RE2CFLAGS = -b -W

# binary
bin_PROGRAMS = re2c
RE2C = re2c$(EXEEXT)

# sources
re2c_HDR = \
	src/codegen/bitmap.h \
	src/codegen/emit.h \
	src/codegen/go.h \
	src/codegen/input_api.h \
	src/codegen/label.h \
	src/codegen/output.h \
	src/codegen/print.h \
	src/options/opt.h \
	src/adfa/action.h \
	src/adfa/adfa.h \
	src/cfg/cfg.h \
	src/dfa/closure_leftmost.h \
	src/dfa/closure_posix.h \
	src/dfa/determinization.h \
	src/dfa/dfa.h \
	src/dfa/posix_precedence.h \
	src/dfa/tag_history.h \
	src/dfa/tagver_table.h \
	src/dfa/tcmd.h \
	src/nfa/nfa.h \
	src/encoding/case.h \
	src/encoding/ebcdic/ebcdic.h \
	src/encoding/ebcdic/ebcdic_regexp.h \
	src/encoding/enc.h \
	src/encoding/range_suffix.h \
	src/encoding/utf8/utf8.h \
	src/encoding/utf8/utf8_regexp.h \
	src/encoding/utf16/utf16_regexp.h \
	src/encoding/utf16/utf16.h \
	src/msg/location.h \
	src/msg/msg.h \
	src/msg/ver_to_vernum.h \
	src/msg/warn.h \
	src/regexp/empty_class_policy.h \
	src/regexp/re.h \
	src/regexp/rule.h \
	src/regexp/tag.h \
	src/compile.h \
	src/skeleton/path.h \
	src/skeleton/skeleton.h \
	src/parse/ast.h \
	src/parse/input.h \
	src/parse/parse.h \
	src/parse/scanner.h \
	src/parse/unescape.h \
	src/debug/debug.h \
	src/util/allocate.h \
	src/util/attribute.h \
	src/util/c99_stdint.h \
	src/util/counter.h \
	src/util/fixed_allocator.h \
	src/util/forbid_copy.h \
	src/util/free_list.h \
	src/util/get_dir.h \
	src/util/hash32.h \
	src/util/local_increment.h \
	src/util/lookup.h \
	src/util/range.h \
	src/util/s_to_n32_unsafe.h \
	src/util/slab_allocator.h \
	src/util/smart_ptr.h \
	src/util/static_assert.h \
	src/util/string_utils.h \
	src/util/temp_file.h \
	src/util/u32lim.h \
	src/util/uniq_vector.h \
	src/util/wrap_iter.h
re2c_SRC = \
	src/codegen/bitmap.cc \
	src/codegen/emit_action.cc \
	src/codegen/emit_dfa.cc \
	src/codegen/label.cc \
	src/codegen/go_construct.cc \
	src/codegen/go_destruct.cc \
	src/codegen/go_emit.cc \
	src/codegen/go_used_labels.cc \
	src/codegen/input_api.cc \
	src/codegen/output.cc \
	src/codegen/print.cc \
	src/options/opt.cc \
	src/nfa/estimate_size.cc \
	src/nfa/re_to_nfa.cc \
	src/adfa/adfa.cc \
	src/adfa/prepare.cc \
	src/debug/dump_adfa.cc \
	src/debug/dump_cfg.cc \
	src/debug/dump_dfa.cc \
	src/debug/dump_interf.cc \
	src/debug/dump_nfa.cc \
	src/cfg/cfg.cc \
	src/cfg/compact.cc \
	src/cfg/dce.cc \
	src/cfg/freeze.cc \
	src/cfg/interfere.cc \
	src/cfg/liveanal.cc \
	src/cfg/normalize.cc \
	src/cfg/optimize.cc \
	src/cfg/rename.cc \
	src/cfg/varalloc.cc \
	src/dfa/closure.cc \
	src/dfa/dead_rules.cc \
	src/dfa/determinization.cc \
	src/dfa/fallback_tags.cc \
	src/dfa/fillpoints.cc \
	src/dfa/find_state.cc \
	src/dfa/minimization.cc \
	src/dfa/tagver_table.cc \
	src/dfa/tcmd.cc \
	src/encoding/ebcdic/ebcdic_regexp.cc \
	src/encoding/enc.cc \
	src/encoding/range_suffix.cc \
	src/encoding/utf8/utf8_regexp.cc \
	src/encoding/utf8/utf8.cc \
	src/encoding/utf16/utf16_regexp.cc \
	src/encoding/utf16/utf16.cc \
	src/msg/msg.cc \
	src/msg/warn.cc \
	src/regexp/ast_to_re.cc \
	src/regexp/default_tags.cc \
	src/regexp/fixed_tags.cc \
	src/regexp/nullable.cc \
	src/regexp/rule.cc \
	src/regexp/split_charset.cc \
	src/regexp/tag.cc \
	src/compile.cc \
	src/skeleton/control_flow.cc \
	src/skeleton/generate_code.cc \
	src/skeleton/generate_data.cc \
	src/skeleton/maxpath.cc \
	src/skeleton/skeleton.cc \
	src/parse/ast.cc \
	src/parse/input.cc \
	src/parse/normalize.cc \
	src/parse/scanner.cc \
	src/parse/unescape.cc \
	src/parse/validate.cc \
	src/util/get_dir.cc \
	src/util/s_to_n32_unsafe.cc \
	src/util/temp_file.cc \
	src/util/range.cc
re2c_SOURCES = \
	src/main.cc \
	$(re2c_HDR) \
	$(re2c_SRC)

# autogenerated sources
re2c_GEN_HELP = src/msg/help.cc
re2c_GEN_LEX = src/parse/lex.cc
re2c_GEN_PARSER = src/parse/parser.cc
re2c_GEN_PARSER_HDR = src/parse/parser.h
re2c_GEN_VER_TO_VERNUM = src/msg/ver_to_vernum.cc
re2c_GEN_SRC = \
	$(re2c_GEN_HELP) \
	$(re2c_GEN_LEX) \
	$(re2c_GEN_PARSER) \
	$(re2c_GEN_VER_TO_VERNUM) \
	src/parse/lex_conf.cc \
	src/options/parse_opts.cc
re2c_GEN_HDR = \
	src/parse/lex.h \
	$(re2c_GEN_PARSER_HDR)
re2c_GEN = \
	$(re2c_GEN_SRC) \
	$(re2c_GEN_HDR)
nodist_re2c_SOURCES = $(re2c_GEN)

# custom rules create headers and must go before normal rules
BUILT_SOURCES = $(re2c_GEN_SRC)

# bootstrap sources
re2c_BOOT_PARSER = bootstrap/src/parse/parser.cc
re2c_BOOT_PARSER_HDR = bootstrap/src/parse/parser.h
re2c_BOOT_DOC = bootstrap/doc/re2c.1
re2c_BOOT_HELP = bootstrap/src/msg/help.cc
re2c_BOOT = \
	$(re2c_BOOT_DOC) \
	$(re2c_BOOT_HELP) \
	$(re2c_BOOT_PARSER) \
	$(re2c_BOOT_PARSER_HDR) \
	bootstrap/src/parse/lex.cc \
	bootstrap/src/parse/lex.h \
	bootstrap/src/parse/lex_conf.cc \
	bootstrap/src/options/parse_opts.cc \
	bootstrap/src/msg/ver_to_vernum.cc

# custom sources
re2c_CUSTOM_PARSER = src/parse/parser.ypp
re2c_CUSTOM_HELP = doc/help.rst
re2c_CUSTOM = \
	$(re2c_CUSTOM_PARSER) \
	$(re2c_CUSTOM_HELP) \
	src/parse/lex.re \
	src/parse/lex_conf.re \
	src/options/parse_opts.re \
	src/msg/ver_to_vernum.re

# docs
re2c_SRC_DOC = doc/manpage.rst
re2c_SRC_DOC_EXT = \
	doc/manual/contributors.rst_ \
	doc/manual/syntax/rules.rst_ \
	doc/manual/syntax/interface.rst_ \
	doc/manual/syntax/configurations.rst_ \
	doc/manual/syntax/named_definitions.rst_ \
	doc/manual/syntax/regular_expressions.rst_ \
	doc/manual/warnings/warnings_list.rst \
	doc/manual/warnings/warnings_general.rst \
	doc/manual/features/generic_api/generic_api.rst_ \
	doc/manual/features/conditions/conditions.rst_ \
	doc/manual/features/state/state.rst_ \
	doc/manual/features/submatch/submatch.rst_ \
	doc/manual/features/encodings/encodings.rst_ \
	doc/manual/options/options_list.rst
DOC = doc/re2c.1
man_MANS = $(DOC)

EXTRA_DIST = \
	$(re2c_BOOT) \
	$(re2c_CUSTOM) \
	$(re2c_SRC_DOC_EXT) \
	CHANGELOG \
	NO_WARRANTY \
	README \
	autogen.sh \
	genhelp.sh \
	doc/loplas.ps \
	doc/sample.bib \
	doc/tdfa/tdfa.pdf \
	examples \
	test

CLEANFILES = \
	$(re2c_GEN) \
	$(DOC)

.re.cc:
	$(AM_V_at)$(MKDIR_P) $(@D)
	$(AM_V_GEN) if test -x $(RE2C); \
	then \
		$(top_builddir)/$(RE2C) $(RE2CFLAGS) -o $@ $< && \
		cp $(@:cc=[ch]*) $(top_srcdir)/bootstrap/$(@D); \
	else \
		cp $(top_srcdir)/bootstrap/$(@:cc=*) $(@D); \
	fi

# cannot update bootstrap with distcheck (it makes srcdir readonly),
# so we update bootstrap only on incremental build (if re2c binary exists)
.ypp.cc:
	$(AM_V_at)$(MKDIR_P) $(@D)
	$(AM_V_GEN) if test $(BISON) = "no"; \
	then \
		cp $(top_srcdir)/bootstrap/$(@:cc=*) $(@D); \
	else \
		$(BISON) --output=$@ --defines=$(@:cc=h) $< && \
		if test -x $(RE2C); then \
			cp $@ $(@:cc=h) $(top_srcdir)/bootstrap/$(@D); \
		fi; \
	fi

# lexer depends on bison-generated header
$(re2c_GEN_LEX): $(re2c_GEN_PARSER)

# rebuild all re2c sources using newly built re2c
.PHONY: bootstrap
bootstrap: all
	rm $(re2c_GEN)
	$(MAKE) all

.PHONY: docs
if REBUILD_DOCS
docs: $(DOC) $(re2c_GEN_HELP)
$(DOC): $(re2c_SRC_DOC) $(re2c_SRC_DOC_EXT)
	$(AM_V_at)$(MKDIR_P) $(@D)
	$(RST2MAN) $(top_builddir)/$(re2c_SRC_DOC) > $@
	cp $@ $(top_srcdir)/$(re2c_BOOT_DOC)
$(re2c_GEN_HELP): $(re2c_CUSTOM_HELP)
	$(AM_V_at)$(MKDIR_P) $(@D)
	$(RST2MAN) $(top_builddir)/$(re2c_CUSTOM_HELP) > $@.1
	$(top_srcdir)/genhelp.sh $@.1 $@
	cp $@ $(top_srcdir)/$(re2c_BOOT_HELP)
else
docs: $(DOC) $(re2c_GEN_HELP)
	@echo "Reconfigure to rebuild docs: ./configure --enable-docs"
$(DOC): $(re2c_BOOT_DOC)
	$(AM_V_at)$(MKDIR_P) $(@D)
	cp $(top_srcdir)/$(re2c_BOOT_DOC) $@
$(re2c_GEN_HELP): $(re2c_BOOT_HELP)
	$(AM_V_at)$(MKDIR_P) $(@D)
	cp $(top_srcdir)/$(re2c_BOOT_HELP) $@
endif

all-local: docs $(re2c_BOOT_PARSER)

# tests
re2c_TESTSUITE = run_tests.sh
.PHONY: tests
tests: all $(re2c_TESTSUITE)
	$(top_builddir)/$(re2c_TESTSUITE)
.PHONY: vtests
vtests: all $(re2c_TESTSUITE)
	$(top_builddir)/$(re2c_TESTSUITE) --valgrind
.PHONY: wtests
wtests: all $(re2c_TESTSUITE)
	$(top_builddir)/$(re2c_TESTSUITE) --wine -j1

re2c_test_range_SOURCES = \
	src/test/range/test-impl.h \
	src/test/range/test.cc \
	src/test/range/test.h \
	src/util/range.cc\
	src/util/range.h \
	src/util/static_assert.h

re2c_test_s_to_n32_unsafe_SOURCES = \
	src/test/s_to_n32_unsafe/test.cc \
	src/util/s_to_n32_unsafe.cc

re2c_test_ver_to_vernum_SOURCES = \
	src/test/ver_to_vernum/test.cc \
	$(re2c_GEN_VER_TO_VERNUM)

check_PROGRAMS = \
	re2c_test_range \
	re2c_test_s_to_n32_unsafe \
	re2c_test_ver_to_vernum

TESTS = \
	$(re2c_TESTSUITE) \
	$(check_PROGRAMS)

# libraries go here (in included .am files)
if WITH_LIBS
ACLOCAL_AMFLAGS = -I m4
lib_LTLIBRARIES =
include $(top_srcdir)/Makefile.lib.am
endif

